package com.dream.service.impl;

import java.util.Date;
import java.util.List;
import java.util.Random;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import com.dream.able.ArticleLableMapper;
import com.dream.able.ArticleMapper;
import com.dream.datasource.DBContextHolder;
import com.dream.pojo.Article;
import com.dream.pojo.ArticleExample;
import com.dream.pojo.ArticleLable;
import com.dream.pojo.ArticleLableExample;
import com.dream.pojo.ArticleSon;
import com.dream.pojo.Imgjson;
import com.dream.service.able.All_Service_able;
import com.dream.service.able.Classification_able;
import com.dream.service.able.Limit_able;
import com.dream.service.able.Random_able;
import com.dream.service.able.Recommend_able;
import com.dream.service.able.Search_able;
import com.dream.service.able.Upload_able;
import com.dream.service.abs.AbsUpload;

/*
 * 文章的业务类
 */
@Service("Article_Serviceimpl")
public class Article_Serviceimpl 
extends AbsUpload
implements All_Service_able<ArticleSon>,
Search_able<ArticleSon>,
Classification_able<ArticleSon>,
Upload_able<Imgjson>,
Limit_able<ArticleSon>,
Recommend_able<Article>,
Random_able<Article>{

	/*
	 * 文章表DAO代理对象
	 */
	@Resource(name="articleMapper")
	private ArticleMapper article_mapper;

	/*
	 * 文章标签表DAO代理对象
	 */
	@Resource(name="articleLableMapper")
	private ArticleLableMapper article_lable_mapper;

	/*
	 * (添加一篇文章,需要传入的数据，标题，文章标签id，内容，用户id，文章展示图片)
	 * @see com.dream.service.able.All_Serviceable#insert(java.lang.String[])
	 */
	@Override
	public ArticleSon insert(String... str) {
		//切换数据源，主库
		DBContextHolder.setDbType(DBContextHolder.master);
		//创建文章对象
		ArticleSon article = new ArticleSon();
		//插入标题
		article.setTitle(str[0]);
		//插入文章分类标签id
		article.setLid(Integer.parseInt(str[1]));
		//插入文章内容
		article.setContext(str[2]);
		//插入时间
		article.setTime(new Date());
		//插入用户id
		article.setUid(Integer.parseInt(str[3]));
		//插入文章阅读数
		article.setCount(0);
		//插入文章展示的图片地址
		article.setImg(str[4]);
		//插入状态
		article.setState(1);
		//写入数据库
		return article_mapper.insertSelective(article)>0?article:null;
	}

	/*
	 * (查询所有可用文章)
	 * @see com.dream.service.able.All_Serviceable#list()
	 */
	@Override
	public List<ArticleSon> list() {
		//切换数据库，从库
		DBContextHolder.setDbType(DBContextHolder.slave);
		//创建查询工具类
		ArticleExample article_example = new ArticleExample();
		//创建查询条件工具内部类
		ArticleExample.Criteria criteria = article_example.createCriteria();
		//设置查询条件state = 1
		criteria.andStateEqualTo(1);
		//返回查询到的数据集
		return article_mapper.listArticle(article_example);
	}

	/*
	 * (搜索功能，传入搜索字符串)
	 * @see com.dream.service.able.Search_able#listsearch(java.lang.String[])
	 */
	@Override
	public List<ArticleSon> listsearch(String... strings) {
		//切换数据源，从库
		DBContextHolder.setDbType(DBContextHolder.slave);
		//创建文章标签查询工具类
		ArticleLableExample articleLableExample = new ArticleLableExample();
		//去掉重复数据
		articleLableExample.setDistinct(true);
		//创建文章标签条件查询工具内部类
		ArticleLableExample.Criteria criteria = articleLableExample.createCriteria();
		//设置查询条件state=1
		criteria.andStateEqualTo(1);
		//设置查询条件，文章标签内容与搜索字符相似
		criteria.andLableLike("%"+strings[0]+"%");
		//获得搜索到的文章标签数据集
		List <ArticleLable> list_articleLable = article_lable_mapper.selectByExample(articleLableExample);
		//创建查询文章工具类
		ArticleExample articleExample = new ArticleExample();
		//创建文章查询条件工具内部类
		ArticleExample.Criteria criteria2 = articleExample.createCriteria();
		//设置查询条件state=1
		criteria2.andStateEqualTo(1);
		//设置查询条件，文章标题，与搜索字符相似
		criteria2.andTitleLike("%"+strings[0]+"%");
		//获得搜索到的文章标题匹配的文章
		List <ArticleSon> list_articleSon =article_mapper.listArticle(articleExample);
		//清空文章查询条件
		articleExample.clear();
		//获取与搜索的文章标签相匹配的文章
		for(int i = 0;i<list_articleLable.size();i++){
			//创建新的文章查询条件内部类
			ArticleExample.Criteria criteria3 = articleExample.createCriteria();
			//设置查询条件state=1
			criteria3.andStateEqualTo(1);
			//设置查询条件，文章的标签匹配搜索的标签
			criteria3.andLidEqualTo(list_articleLable.get(i).getLid());
			//获得搜索到的文章标签匹配的文章
			list_articleSon.addAll(article_mapper.listArticle(articleExample));
			//清空查询条件
			articleExample.clear();
		}
		//返回查询到的所有文章集
		return list_articleSon;
	}

	/*
	 * (按文章标签分类查询)
	 * @see com.dream.service.able.Classification_able#listClassification(java.lang.Integer)
	 */
	@Override
	public List<ArticleSon> listClassification(Integer lid) {
		//切换数据源,从库
		DBContextHolder.setDbType(DBContextHolder.slave);
		//创建查询工具类
		ArticleExample articleExample = new ArticleExample();
		//创建查询条件工具内部类
		ArticleExample.Criteria criteria = articleExample.createCriteria();
		//设置查询条件state=1
		criteria.andStateEqualTo(1);
		//设置查询条件，文章的文章标签id等于传入的标签id
		criteria.andLidEqualTo(lid);
		//返回查询到的数据集
		return article_mapper.listArticle(articleExample);
	}

	/**
	 * (查询单个文章，传入文章的主键，和是否添加阅读量的代码)
	 * @see com.dream.service.able.All_Service_able#getT(java.lang.String[])
	 */
	@Override
	public ArticleSon getT(String... str) {
		//切换数据源,主库
		DBContextHolder.setDbType(DBContextHolder.master);
		//查询文章的阅读量
		Article article = article_mapper.selectByPrimaryKey(Integer.parseInt(str[0]));
		//判断是否是一个会话的阅读，如果是，则不添加阅读量
		if(str.length>1&&str[1]!=null&&Integer.parseInt(str[1])==1){
			//创建文章实例，这是对数据库的数据的修改
			Article article2 = new Article();
			//设置主键
			article2.setAid(article.getAid());
			//设置需要修改的值，添加阅读量
			article2.setCount(article.getCount()+1);
			//将修改写入数据库
			article_mapper.updateByPrimaryKeySelective(article2);

		}
		//查询单篇文章
		return article_mapper.selectArticle(Integer.parseInt(str[0]));
	}

	/*
	 * (查询指定条数和位置的数据,传入开始的位置，和返回的数据数目)
	 * @see com.dream.service.able.Limit_able#list_Limit(java.lang.String[])
	 */
	@Override
	public List<ArticleSon> list_Limit(String... str) {
		//切换数据库，从库
		DBContextHolder.setDbType(DBContextHolder.slave);
		//创建查询工具类
		ArticleExample article_example = new ArticleExample();
		//设置排序规则
		article_example.setOrderByClause("aid desc");
		//设置返回的数据的开始位置
		article_example.setOffset(Integer.parseInt(str[0]));
		//设置返回多少条数据
		article_example.setLimit(Integer.parseInt(str[1]));
		//创建查询条件工具内部类
		ArticleExample.Criteria criteria = article_example.createCriteria();
		//设置查询条件state = 1
		criteria.andStateEqualTo(1);
		//返回查询到的数据集
		return article_mapper.listArticle(article_example);
	}

	/*
	 * (热文推荐,传入，启示位置和返回数目)
	 * @see com.dream.service.able.Recommend_able#ListRecommend(java.lang.String[])
	 */
	@Override
	public List<Article> ListRecommend(String ... str) {
		//切换数据库，从库
		DBContextHolder.setDbType(DBContextHolder.slave);
		//创建查询工具类
		ArticleExample article_example = new ArticleExample();
		//设置排序规则
		article_example.setOrderByClause("count desc");
		//设置返回的数据的开始位置
		article_example.setOffset(Integer.parseInt(str[0]));
		//设置返回多少条数据
		article_example.setLimit(Integer.parseInt(str[1]));
		//创建查询条件工具内部类
		ArticleExample.Criteria criteria = article_example.createCriteria();
		//设置查询条件state = 1
		criteria.andStateEqualTo(1);
		//返回查询到的数据集
		return article_mapper.selectByExample(article_example);
	}

	/*
	 * (随机文章,传入开始位置，和返回数目)
	 * @see com.dream.service.able.Random_able#random(java.lang.String[])
	 */
	@Override
	public List<Article> random(String ... str) {
		//切换数据库，从库
		DBContextHolder.setDbType(DBContextHolder.slave);
		//创建查询工具类
		ArticleExample article_example = new ArticleExample();
		//创建随机数对象
		Random random = new Random();
		//设置返回的数据的开始位置
		article_example.setOffset(random.nextInt());
		//设置返回多少条数据
		article_example.setLimit(Integer.parseInt(str[0]));
		//创建查询条件工具内部类
		ArticleExample.Criteria criteria = article_example.createCriteria();
		//设置查询条件state = 1
		criteria.andStateEqualTo(1);
		//返回查询到的数据集
		return article_mapper.selectByExample(article_example);
	}
}
